nanopyx.core.transform.image_rotate
Combination of functions for rotating an image, using several interpolation methods.
1""" 2Combination of functions for rotating an image, using several interpolation methods. 3""" 4 5from scipy.ndimage import rotate 6import numpy as np 7 8from ..utils.timeit import timeit2 9from . import interpolation_bicubic 10from . import interpolation_bilinear 11from . import interpolation_nearest_neighbor 12from . import interpolation_catmull_rom 13from . import interpolation_lanczos 14 15from skimage.transform import AffineTransform, warp 16import cv2 17 18@timeit2 19def catmull_rom_rotate(image: np.ndarray, angle:float): 20 interpolator = interpolation_catmull_rom.Interpolator(image) 21 return interpolator.rotate(angle) 22 23 24@timeit2 25def lanczos_rotate(image: np.ndarray, angle:float): 26 interpolator = interpolation_lanczos.Interpolator(image) 27 return interpolator.rotate(angle) 28 29 30@timeit2 31def bicubic_rotate(image: np.ndarray, angle:float): 32 interpolator = interpolation_bicubic.Interpolator(image) 33 return interpolator.rotate(angle) 34 35 36@timeit2 37def bilinear_rotate(image: np.ndarray, angle:float): 38 interpolator = interpolation_bilinear.Interpolator(image) 39 return interpolator.rotate(angle) 40 41 42@timeit2 43def nearest_neighbor_rotate(image: np.ndarray, angle:float): 44 interpolator = interpolation_nearest_neighbor.Interpolator(image) 45 return interpolator.rotate(angle) 46 47 48@timeit2 49def scipy_rotate(image: np.ndarray, angle:float): 50 return rotate(image, np.rad2deg(angle), reshape=False) 51 52 53@timeit2 54def skimage_rotate(image: np.ndarray, angle:float): 55 rotation = AffineTransform(rotation=angle) 56 shift2center = AffineTransform(translation=-np.array(image.shape[:2][::-1]) / 2) 57 shift2og = AffineTransform(translation=np.array(image.shape[:2][::-1]) / 2) 58 return warp(image, shift2center + rotation + shift2og) 59 60 61@timeit2 62def cv2_rotate(image: np.ndarray, angle:float): 63 rotmat = cv2.getRotationMatrix2D(np.array(image.shape[:2][::-1]) / 2, np.rad2deg(angle), 1) 64 return cv2.warpAffine(image, rotmat, image.shape[:2][::-1])